/******************************************************************************* * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.ant.internal.ui.editor; import java.util.ArrayList; import java.util.List; import org.eclipse.ant.internal.ui.editor.text.XMLTextHover; import org.eclipse.ant.internal.ui.model.AntElementNode; import org.eclipse.ant.internal.ui.model.AntModel; import org.eclipse.ant.internal.ui.model.IAntElement; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.Position; public class OccurrencesFinder { private AntModel fAntModel; private AntEditor fEditor; private int fOffset; private IDocument fDocument; public OccurrencesFinder(AntEditor editor, AntModel model, IDocument document, int offset) { fAntModel = model; fEditor = editor; fDocument = document; fOffset = offset; } public List<Position> perform() { if (fOffset == 0 || fAntModel == null) { return null; } AntElementNode container = fAntModel.getNode(fOffset, false); if (container == null) { return null; } IRegion region = XMLTextHover.getRegion(fEditor.getViewer(), fOffset); if (region != null) { if (!container.isRegionPotentialReference(region)) { return null; } } AntElementNode node; if (container.isFromDeclaration(region)) { node = container; } else { Object potentialNode = fEditor.findTarget(region); if (!(potentialNode instanceof AntElementNode)) { return null; } node = (AntElementNode) potentialNode; } String occurrencesIdentifier = node.getOccurrencesIdentifier(); if (occurrencesIdentifier == null) { return null; } List<IAntElement> nodes = new ArrayList<>(1); nodes.add(fAntModel.getProjectNode()); List<IAntElement> usages = new ArrayList<>(); usages.add(node); scanNodesForOccurrences(nodes, usages, occurrencesIdentifier); String identifier; try { identifier = fDocument.get(region.getOffset(), region.getLength()); } catch (BadLocationException e) { return null; } int length = identifier.length(); if (length == 0) { return null; } List<Position> positions = new ArrayList<>(usages.size()); for (IAntElement currentNode : usages) { List<Integer> offsets = currentNode.computeIdentifierOffsets(identifier); if (offsets != null) { for (int i = 0; i < offsets.size(); i++) { positions.add(new Position(offsets.get(i).intValue(), length)); } } } return positions; } private void scanNodesForOccurrences(List<IAntElement> nodes, List<IAntElement> usages, String identifier) { for (IAntElement node : nodes) { if (!usages.contains(node) && node.containsOccurrence(identifier)) { usages.add(node); } if (node.hasChildren()) { scanNodesForOccurrences(node.getChildNodes(), usages, identifier); } } } }